package main

import (
	"fmt"
	"sync"
)

func main()  {
	var data int
	go func() { data++ } ()
	if data==0 {
		fmt.Println("the value is 0.")
	} else {
		fmt.Printf("the value is %v.\n",data)
	}

	a := `示例中的三个临界区：
	goroutine正在增加数据变量。
	if语句检查数据的值是否为0。
	fmt.Printf语句检索并输出数据的值。`
	fmt.Println(a)


	//演示会内存同步示例(非go惯用方法)：
	//虽然解决了数据竞争，但是操作顺序任然不确定：

	var memoryAccess sync.Mutex    //添加变量，允许代理对内存数据的访问做同步
	var value int
	go func() {
		memoryAccess.Lock()    //加锁，让goroutint独占该内存的访问权限
		value++
		memoryAccess.Unlock()  //解锁，goroutine使用完了该段内存
	} ()
	memoryAccess.Lock()    //加锁，声明下面的条件语句独占变量data的内存访问权限
	if value==0 {
		fmt.Printf("the value is %v.\n",value)
	} else {
		fmt.Printf("the value is %v.\n",value)
	}
	memoryAccess.Unlock()  //解锁，宣布独占结束


}













